Virtualbox 相关
Table of Contents
1. VirtualBox 使用
1.1. 精简虚拟磁盘文件的大小
1.1.1. 对未使用部分的非 0 块写 0
1.1.1.1. Linux 虚拟机
如果文件系统为 ext 系列,使用 zerofree 这个包能做到只对非 0 块写 0,减少了非必要的写入操作,延长了硬盘寿命。具体操作方法为:
- 用 Ubuntu 或者 Debian 的 live 镜像进入体验系统。
- 执行
sudo apt install -y zerofree
安装软件。 - 执行
sudo zerofree /dev/sda{2-3}
对分区写 0 后退出体验系统。
如果文件系统为 xfs 或者其他,那么只能用最基础的方法:
# 创建一个全 0 的大文件,对于所有的块写 0
dd if=/dev/zero of=/null.dat
# 删除这个文件
rm -f /null.dat
1.1.1.2. Windows 虚拟机
在 windows 虚拟机上,下载微软 SysinternalsSuite 套件,执行里面的 sdelete.exe: .\sdelete.exe -z c:
1.1.2. 精简磁盘文件
如果使用 Linux 为宿主机,执行如下命令,根据情况替换 VDI 磁盘路径:
VBoxManage modifyhd --compact /home/lsz/VirtualBoxVMs/Win10LTSC/Win10LTSC.vdi
如果使用 Windows 为宿主机,在 PowerShell 或者 CMD 中执行如下命令,根据情况替换 VDI 磁盘路径:
PS C:\Users\lsz> cd C:\"Program Files"\Oracle\VirtualBox PS C:\Program Files\Oracle\VirtualBox> .\VBoxManage modifyhd --compact D:\VirtualBoxVMs\Win10LTSC2019\Win10LTSC2019.vdi
1.2. 虚拟机复制
尽量在 virtualbox 的界面按下 Alt+M 选择 复制 来进行虚拟机复制。
如果只是复制原虚拟机文件夹,然后直接粘贴产生副本,那么在导入副本中的虚拟机时,virtualbox 会报错:
未能打开位于 D:/VirtualBoxVMs/Win10LTSC2/Win10LTSC.vbox 的虚拟电脑。 Trying to open a VM config 'D:/VirtualBoxVMs/Win10LTSC2/Win10LTSC.vbox' which has the same UUID as an existing virtual machine. 返回 代码: E_FAIL (0x80004005) 组件: MachineWrap 界面: IMachine {85632c68-b5bb-4316-a900-5eb28d3413df} 被召者: IVirtualBox {d0a0163f-e254-4e5b-a1f2-011cf991c38d}
如果只是 VDI 文件的 UUID 冲突,可以使用 VirtualBox 自带的工具为硬盘重新生成 UUID:
PS C:\Users\lsz> cd C:\Program Files\Oracle\VirtualBox PS C:\Program Files\Oracle\VirtualBox> .\VBoxManage.exe internalcommands sethduuid "D:/VirtualBoxVMs/Win10LTSC2/Win10LTSC.vdi" UUID changed to: 8acc15bc-cefc-41ce-83d2-b4e2c4f0a154
但如果整个虚拟机完全相同,那要改的地方就太多了。此处略过。
2. Linux 虚拟机
2.1. 关于增强功能
原先 VirtualBox 的增强功能是需要先挂载一个 ISO 文件,然后执行脚本编译内核模块。这也意味着,如果内核更新了,这个模块需要重新编译一遍。
后来 VirtualBox 学习 VMware 把增强功能做进了 virtualbox-guest-additions 软件包中,并将其发布在多个发行版的软件源中:
- Debian 系发行版默认软件源中有这个包。
- RedHat 系发行版的包在 rpmfusion 这个第三方源里面。
- Fedora 自带的软件源里有这个包。
用包管理器安装 virtualbox-guest-additions 即可安装增强功能,不必再手动编译了。
2.2. 不能使用文件拖拽 ( drag and drop ) 功能
在使用 x11 套件作为桌面服务的发行版中,安装 virtualbox-guest-additions 后,文件拖拽功能就可以正常使用了。
但是自 Debian 10 和 Fedora 25 开始,Wayland 是默认的桌面服务,而 Wayland 不支持 Virtualbox 的拖拽功能。
所以,在使用 Wayland 作为桌面服务的发行版中,无论 virtualbox-guest-additions 是否安装,都无法使用拖拽功能。
2.3. vmwgfx: Failed to send host log message
Linux 如果使用了 VMSVGA 作为显卡控制器会报:
... [drm:vmw_host_log [vmwgfx]] ERROR Failed to send host log message.
这个 [bug](https://www.virtualbox.org/ticket/19168) 在 VirtualBox 6.1.0 的时候就出现了,但是直到 6.1.30 都没修好。
如果不使用 GUI 的话,只需要把显卡控制器改成其他类型就好了。不改的话倒是用起来也没什么问题。
2.4. Virtio-SCSI 的 Bug
Virtio-SCSI 直到 6.1.30 还是个实验特性,尽量别用。否则在 Linux 启动的时候,日志里可能出现这样的报错:
[...] blk_update_request: I/O error, dev sda, sector yyyyyy op 0x0:(READ) flags 0x80700 phys_seg 20 prio class 0
如果只给虚拟机 1 个 vCPU,Virtio-SCSI 这个特性是能用的:
- AHCI (Host I/O Cache on or off) = OK
- virtio-scsi (Host I/O Cache on or off) = OK
但如果给 2 个 vCPU,就不能开 I/O 缓存了:
- AHCI (Host I/O Cache on or off) = OK
- virtio-scsi (Host I/O Cache off) = OK
- virtio-scsi (Host I/O Cache on) = BAD (I/O errors)
3. Windows 虚拟机
3.1. 发送 ACPI 信号无法关机 ( 正常关闭无反应,只能强制退出 )
对于物理机来说,ACPI 的关机信号由物理电源按键发送,而 VirtualBox 在关闭虚拟机时就是模拟物理按键发送 ACPI 关机信号。
无法关机的原因在于 ACPI 信号的接收或者处理出了问题,在 控制面板 -> 系统和安全 -> 电源选项 -> 选择电源按钮的功能 中,把 按电源按钮时 改为 关机 即可。